package org.yelongframework.pdf;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * PDF文件工具
 * 
 * @since 1.0.0
 */
public interface PdfTools {

	/**
	 * 将PDF文件拆分为图片，每个图片为PDF的一页
	 * 
	 * @param inputStream PDF文件流
	 * @return 图片字节数组集合。这是有顺序的，顺序为PDF的页顺序
	 * @throws IOException 流异常
	 */
	List<byte[]> splitPageToImagesBytes(InputStream inputStream) throws IOException;

	/**
	 * 将PDF文件拆分为图片，每个图片为PDF的一页
	 * 
	 * @param inputStream PDF文件流
	 * @param imageType   图片格式。如:jpg,png等
	 * @return 图片字节数组集合。这是有顺序的，顺序为PDF的页顺序
	 * @throws IOException 流异常
	 */
	List<byte[]> splitPageToImagesBytes(InputStream inputStream, String imageType) throws IOException;

	/**
	 * 将PDF文件拆分为图片，并将图片写到输出流中，每个图片为PDF的一页
	 * 
	 * <pre>
	 * FileInputStream inputStream = new FileInputStream("M:\\test.pdf");
	 * pdfTools.splitPageToImagesOutputStream(inputStream,
	 * 		x -> new FileOutputStream(FileUtilsE.createDirectoryOverride("M:", x + ".jpg")));
	 * </pre>
	 * 
	 * @param inputStream               PDF文件流
	 * @param imageOutputStreamSupplier 图片输出流供应商
	 * @return 图片输入出流集合。这是有顺序的，顺序为PDF的页顺序
	 * @throws IOException 流异常
	 */
	List<OutputStream> splitPageToImagesOutputStream(InputStream inputStream,
			ImageOutputStreamSupplier imageOutputStreamSupplier) throws IOException;

	/**
	 * 将PDF文件拆分为图片，并将图片写到输出流中，每个图片为PDF的一页
	 * 
	 * <pre>
	 * FileInputStream inputStream = new FileInputStream("M:\\test.pdf");
	 * pdfTools.splitPageToImagesOutputStream(inputStream, "jpg",
	 * 		x -> new FileOutputStream(FileUtilsE.createDirectoryOverride("M:", x + ".jpg")));
	 * </pre>
	 * 
	 * @param inputStream               PDF文件流
	 * @param imageType                 图片格式。如:jpg,png等
	 * @param imageOutputStreamSupplier 图片输出流供应商
	 * @return 图片输入出流集合。这是有顺序的，顺序为PDF的页顺序
	 * @throws IOException 流异常
	 */
	List<OutputStream> splitPageToImagesOutputStream(InputStream inputStream, String imageType,
			ImageOutputStreamSupplier imageOutputStreamSupplier) throws IOException;

	/**
	 * 图片输出流供应商
	 */
	@FunctionalInterface
	public static interface ImageOutputStreamSupplier {

		/**
		 * 获取PDF页转换为图片输出到的流
		 * 
		 * @param page PDF的页数，从0开始
		 * @return 转化为图片后将图片输出到的流
		 * @throws IOException 流异常
		 */
		OutputStream get(int page) throws IOException;

	}

}
